package com.back.campus_back.service.impl;

import com.back.campus_back.domain.Goods;
import com.back.campus_back.domain.User;
import com.back.campus_back.mapper.GoodsMapper;
import com.back.campus_back.service.GoodsService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 *  商品服务实现类
 * </p>
 *
 * @author ${author}
 * @since 2021-04-17
 */
@Service
public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements GoodsService {
    @Autowired
    private GoodsMapper goodsMapper;
    @Autowired
    private RedisTemplate redisTemplate;

    /*
     * 查询全部商品
     * */
    @Override
    public List<Goods> findAllGoods(){
        List<Goods> Goodslist = goodsMapper.selectList(null);
        return Goodslist;

    }


    /*
     * 查询全部商品：分页查询(当前页和查询数目)
     * */
    @Override
    public IPage<Goods> findAllGoods(Integer current, Integer size){
        //参数1：当前页
        //参数二：页面大小
        Page<Goods> page = new Page<Goods>(current,size);
        QueryWrapper<Goods> wrapper = new QueryWrapper<>();
        //根据创建时间降输出
        wrapper.orderByDesc("create_time");
        //判断状态为1的商品：1是正常发布状态,2是已经被购买状态,0是下架了商品的状态
        wrapper.eq("status",1);
        IPage<Goods> goodsIPage = goodsMapper.selectPage(page, wrapper);

        return goodsIPage;
    }


    /*
     * 根据商品id查询商品
     * */
    @Override
    public Goods findGoodsById(Integer id){
        Goods goods=null;
        //先从redis缓存中查询数据
        Object o = redisTemplate.opsForValue().get(id);
        //查询不为空，说明缓存有数据，那就直接返回
        if(o!=null){
            goods=(Goods) o;
        }else{
            //反之，说明缓存无中此数据，那就去数据查询
            QueryWrapper<Goods> wrapper = new QueryWrapper<>();

            wrapper.eq("id",id);
            //判断状态为1的商品：1是正常发布状态,2是已经被购买状态,0是下架了商品的状态
            wrapper.eq("status",1);
            //查询一个数据
            goods=goodsMapper.selectOne(wrapper);
            if (goods !=null){
                //数据库查询到不为空，就将数据加到redis缓存中,设置有效期2天
                redisTemplate.opsForValue().set(id,goods,2, TimeUnit.DAYS);
            }else {
                return null;
            }
        }
        return goods;
    }


    /*
     * 根据商品的分类获取首页展示的商品信息
     * */
    @Override
    public IPage<Goods> findGoodsByType(Integer goods_type, Integer current, Integer size){

        QueryWrapper<Goods> wrapper = new QueryWrapper<>();
        wrapper.eq("goods_type",goods_type);
        //根据创建时间降输出
        wrapper.orderByDesc("create_time");
        //判断状态为1的商品：1是正常发布状态,2是已经被购买状态,0是下架了商品的状态
        wrapper.eq("status",1);
        //返回分页数据
        Page<Goods> page = new Page<Goods>(current,size);
        IPage<Goods> goodsIPage = goodsMapper.selectPage(page, wrapper);
        return goodsIPage;
    }

    /*
     * 根据商品分类id获取首页展示的前七条商品信息
     * */
    public List<Goods> getPromoGoods(Integer goods_type){
        QueryWrapper<Goods> wrapper = new QueryWrapper<>();
        wrapper.eq("goods_type",goods_type);
        wrapper.orderByDesc("create_time");
        //使用last方法拼接sql语句
        wrapper.last("limit 7");
        List<Goods> goods = goodsMapper.selectList(wrapper);
        return goods;
    }

    /*
     * 根据名字模糊查询商品模加分页
     * pageNum:当前页
     * pageSize:数目
     * */
    @Override
    public IPage<Goods> SearchGoods(String goodsName,Integer current, Integer size){
        QueryWrapper<Goods> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("create_time");
        //查询商品名中有goodsName的商品
        wrapper.like("name",goodsName);
        //判断状态为1的商品：1是正常发布状态,2是已经被购买状态,0是下架了商品的状态
        wrapper.eq("status",1);
        Page<Goods> page = new Page<Goods>(current,size);
        IPage<Goods> goodsIPage = goodsMapper.selectPage(page, wrapper);
        return goodsIPage;
    }


    /*
     * 发布商品
     * */
    @Override
    public String userInsertGoods(Goods goods){

        int result = goodsMapper.insert(goods);
        if(result == 1){
            return "add_success";
        }else{
            return "add_error";
        }
    }

    /*
     * 根据用户的id查询用户发布的商品信息
     * */
    @Override
    public IPage<Goods> findGoodsByStuId(Integer student_id,Integer current, Integer size,Integer status){
        QueryWrapper<Goods> wrapper = new QueryWrapper<>();
        wrapper.eq("student_id",student_id);
        //判断状态为1的商品：1是正常发布状态,2是已经被购买状态,0是下架了商品的状态
        wrapper.eq("status",status);
        Page<Goods> page = new Page<Goods>(current,size);
        IPage<Goods> goodsIPage = goodsMapper.selectPage(page, wrapper);
        return goodsIPage;
    }


    /*
     * 更新
     * 商品信息
     * */
    @Override
    public String updateGoodsInfo(Goods goods){
        try {
            int result = goodsMapper.updateById(goods);
            int id= goods.getId();
            //更新缓存信息
            redisTemplate.opsForValue().set(id,goods);
            if(result == 1){
                return "up_success";
            }else{
                return "up_error";
            }
        }catch (Exception e) {
            e.printStackTrace();
            System.out.println(e);
        }
        return "up_error";
    }


    /*
     * 用户根据商品的id，重新上架或者下架自己发布的商品
     * 重新上架:status==>1
     * 下架:status==>0
     * */
    public String updateGoodsStatusById(Integer id,Integer status){
        Goods goods = goodsMapper.selectById(id);
        //  //设置商品状态为0：1是正常发布状态,2是已经被购买状态,0是下架了商品的状态
        goods.setStatus(status);
        int result = goodsMapper.updateById(goods);
        if(result == 1){
            return "up_success";
        }else{
            return "up_error";
        }
    }



}
